﻿#pragma once
#include <QMap>
#include "componentbase.h"
#include "plate_data.h"


class Algorithm;

class StackPlate
{

public:
	StackPlate();
	~StackPlate();
	bool Init(const plate::PlateInfo& param);

	/*获取托盘物料信息*/
	bool ManualChangePlateState(plate::PlateState& info);
	plate::PlateState GetPlateStateInfo();
	QString GetPlateId() { return m_id; }

	// 设置托盘状态为到位状态
	bool SetPlateArrived();
	bool SetPlateMoved();

	// 设置托盘占用
	bool GetPlateBusyState();
	bool SetPlateBusy();
	bool SetPlateRelease();

	// 托盘货物信息处理，更新托盘上的货物信息, 以及物料码放方式 0：表示算法自定义
	bool UpdataPlateSkuInfo(const SkuInfo& sku, int stackType = 0);
	// 放货通知
	bool AddSkuToPlate(int num);

	/*获取托盘到位状态， true:托盘到位*/
	bool GetPlateState();
	/*获取托盘上物料数量， -1 表示托盘未到位，>=0表示托盘上物料数量*/
	int GetPlateSkuNum();

	/*算法计算下一次抓取数据，index:抓取次序 plan：计划放货数量*/
	bool CalculateNextGrab(int index, int plan, QString& info);
	/*获取下次最大放货数量*/
	int GetNextGrabNum(int index);
	/*获取下次最大放货位置*/
	bool GetNextGrabPosition(int index, Position& pos);

private:
	/*托盘到位DI校验*/
	bool CheckDI(bool state);

	/*初始化托盘信息*/
	bool InitPlateState();

	/*算法初始化物料信息*/
	bool InitAlgSkuInfo();

	/*保存托盘信息到数据k*/
	bool SavePlateInfoToSql();

private:
	QString m_id;

	int m_di = 0;	// 托盘监测DI;

	bool m_busy = false;
	plate::PlateState m_state = {};
	Algorithm* m_alg = nullptr;
	struct {
		int index;
		int num;	// 当前托盘单次最大放货数量
		Position pos;	// 放货坐标
		void clear()
		{
			index = -1;
			num = -1;
			pos = { };
		}
	} m_algResult = {};

	ComponentBase* m_rob = nullptr;
};
